package com;

import io.netty.util.concurrent.FastThreadLocal;
import io.netty.util.internal.InternalThreadLocalMap;

/**这里首先声明一个内部类FastThreadLocalTest继承FastThreadLocal, 并重写initialValue方法, initialValue方法就是用来初始化线程共享对象的
然后声明一个成员变量fastThreadLocalTest, 类型就是内部类FastThreadLocalTest
在构造方法中初始化fastThreadLocalTest

main方法中创建当前类FastThreadLocalDemo的对象fastThreadLocalDemo
然后启动两个线程, 每个线程通过fastThreadLocalDemo.fastThreadLocalTest.get()的方式拿到线程共享对象, 因为fastThreadLocalDemo是相同的, 所以fastThreadLocalTest对象也是同一个, 同一个对象在不同线程中进行get()
第一个线程循环通过set方法修改共享对象的值
第二个线程则循环判断并输出fastThreadLocalTest.get()出来的对象和第一次get出来的对象是否相等
这里输出结果都true, 说明其他线程虽然不断修改共享对象的值, 但都不影响当前线程共享对象的值
这样就实现了线程共享的对象的功能
 * @author Ziroom
 *
 */
public class SlowThreadLocalDemo {

	final class FastThreadLocalTest extends FastThreadLocal<Object>{
        @Override
        protected Object initialValue() throws Exception {
            return new Object();
        }
    }

    private final FastThreadLocalTest fastThreadLocalTest;

    public SlowThreadLocalDemo(){
        fastThreadLocalTest = new FastThreadLocalTest();
    }

    public static void main(String[] args){

        SlowThreadLocalDemo fastThreadLocalDemo = new SlowThreadLocalDemo();


        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Object obj  = fastThreadLocalDemo.fastThreadLocalTest.get();
                    for (int i=0; i<10; i++){
                        System.out.println(obj == fastThreadLocalDemo.fastThreadLocalTest.get());
                        Thread.sleep(1000);
                    }
                }catch (Exception e){

                }
            }
        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                Object obj  = fastThreadLocalDemo.fastThreadLocalTest.get();
                try {
                    for (int i=0;i<10;i++){
                        // fastThreadLocalDemo.fastThreadLocalTest.set(new Object());
                        fastThreadLocalDemo.fastThreadLocalTest.set(InternalThreadLocalMap.UNSET); // 本质上就是清除
                        Thread.sleep(1000);
                    }
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        }).start();
    }

}
